package com.alinesno.cloud.gateway.core.dispather.mina.codec;

import java.nio.charset.Charset;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alinesno.cloud.gateway.core.dispather.mina.bean.BusinessServerBean;
import com.alinesno.cloud.gateway.core.dispather.mina.bean.MessageBean;

/**
 * 类负责创建的 MemcachedResponse 读取字节 代表当前解析状态,这意味着我们需要解析的头或 body 根据解析状态切换
 * 如果不是至少24个字节是可读的,它不可能读整个头部,所以返回这里,等待再通知一次数据准备阅读 阅读所有头的字段
 * 检查是否足够的数据是可读用来读取完整的响应的 body。长度是从头读取 检查如果有任何额外的 flag 用于读，如果是这样做 检查如果响应包含一个
 * expire 字段，有就读它 检查响应是否包含一个 key ,有就读它 读实际的 body 的 payload 从前面读取字段和数据构造一个新的
 * MemachedResponse
 * 
 * @author WeiXiaoJin
 * @since 2019年9月21日 下午8:58:33
 */
public class ResponseMessageDecoder extends CumulativeProtocolDecoder {

	@SuppressWarnings("unused")
	private static final Logger log = LoggerFactory.getLogger(ResponseMessageDecoder.class);

	@SuppressWarnings("unused")
	private BusinessServerBean e;

	private enum State {
		Header, Body
	}

	private State state = State.Header;
	private int totalBodySize;
	private String magic;
	private String data;

	public ResponseMessageDecoder(BusinessServerBean server) {
		this.e = server;
	}

	@Override
	protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
		
		switch (state) {
		case Header: // 前4位为魔数，后8位为报文长度
			if (in.remaining() < 12) {
				return true;
			}
			byte[] magicByte = new byte[4];
			byte[] length = new byte[8];

			in.get(magicByte); // 4位
			in.get(length); // 8位

			magic = new String(magicByte, Charset.forName("UTF-8"));
			totalBodySize = Integer.parseInt(new String(length, Charset.forName("UTF-8")));

			state = State.Body;
		case Body:
			if (in.remaining() < totalBodySize) {
				return true;
			}
			byte[] bodyBuffer = new byte[totalBodySize];
			in.get(bodyBuffer);
			data = new String(bodyBuffer, Charset.forName("UTF-8"));

			state = State.Header;
		}

		// TODO 完善加密方式
//		boolean hasEncryption = e.isHasEncryption(); // 是否加密(默认不加密)
//		String encType = e.getEncType(); // 加密方式
//		String decodeStr = e.getDecodeStr(); // 解密代码

		MessageBean message = new MessageBean();
		message.setLength(totalBodySize + "");
		message.setMagic(magic);
		message.setData(data);

		out.write(message);

		return false; // 处理成功
	}

	
}